package hprose;

import hprose.client.HproseClient;

import java.util.Map;
import java.util.TreeMap;

import models.CommonApi;
import play.Logger;
import utils.db.TransactionUtil;
import constants.Constants;

/**
 * Hprose客户端服务
 * 主要提供远程同步以及异步调用服务
 * 2015年10月22日 下午5:22:09
 * @author huan208050@vip.qq.com
 */
public class HproseClinetService {
	/**
	 * 同步调用远程接口
	  * @param map 需要传送的参数
	  * @return json格式数据
	  * 2015年10月22日 下午5:26:31
	  * @auth huan208050@vip.qq.com
	 */
	public static String synCall(String mark,Map<String,Object> map){
		
		CommonApi api = CommonApi.find("mark = ?", mark).first();
		if(api==null){
			return Constants.API_NOT_FOUND;
		}
		//该处集成参数判断
		//参数判断结束
		HproseClient client;
		String result = "";
		Object[] arguments = new Object[] { map }; 
		try {
			client = HproseClient.create("tcp://"+api.host+":"+api.port+"/");//调用公共服务api
			result = client.invoke(api.callName, arguments , String.class);
			client.close();
		} catch (Exception e) {
			Logger.error(e.getMessage());
			return Constants.SERVER_NOT_AVAILABLE;
		}
		return result;
	}
	
	/**
	 * 发送消息
	 * @param type
	 * @param map
	 * @param customer_id
	 * @return
	 * 2015年10月27日 上午11:38:22
	 * @auth huan208050@vip.qq.com
	 */
	public static boolean sendMessage(String type,TreeMap<String,Object> map,String customer_id){
		
		TransactionUtil.startTx();
		CommonApi api = CommonApi.find("mark = ?", "mq_server").first();
		TransactionUtil.closeTx(false);
		if(api==null){
			return false;
		}
		HproseClient client;
		boolean result;
		Object[] arguments = new Object[] { type,map,customer_id }; 
		try {
			StringBuffer buff = new StringBuffer();
			buff.append("tcp://").append(api.host).append(":").append(api.port);
			Logger.debug("mq server address :"+buff.toString());
			client = HproseClient.create(buff.toString());//调用公共服务api
			result = client.invoke(api.callName, arguments , boolean.class);
			client.close();
		} catch (Exception e) {
			Logger.error(e.getMessage());
			return false;
		}
		return result;
	}
	/**
	 * 远程调用，调试使用
	 * @param callName
	 * @param arguments
	 * @param host
	 * @param port
	 * @return
	 */
	public static String synCall(String callName,Object[] arguments,String host,int port){
		//该处集成参数判断
		//参数判断结束
		HproseClient client;
		String result = "";
		try {
			client = HproseClient.create("tcp://"+host+":"+port+"/");//调用公共服务api
			result = client.invoke(callName, arguments , String.class);
			client.close();
		} catch (Exception e) {
			Logger.error(e.getMessage());
			return Constants.SERVER_NOT_AVAILABLE;
		}
		return result;
	}
}
